<?php

namespace app\common\command;

use app\common\command\task\Test;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;

class Task extends Command
{
    /**
     * 指令配置
     * @return void
     */
    protected function configure()
    {
        $this->setName('task')
            ->addArgument('name', Argument::OPTIONAL, "任务名称")
            ->setDescription('task');
    }

    /**
     * 子指令集合
     * @var string[]
     */
    protected $taskContainer = [
        // 命令行测试脚本:php think task test
        'test' => Test::class,
    ];

    /**
     * @param Input $input
     * @param Output $output
     * @return void
     */
    protected function execute(Input $input, Output $output)
    {
        // 请求参数
        $name = trim($input->getArgument('name'));

        // 检查是否存在任务
        if (!isset($this->taskContainer[$name])) {
            $output->writeln("任务{$name}不存在");
            exit();
        }

        // 提取Class
        $class = $this->taskContainer[$name];

        // 执行任务
        try {
            $reflect = new \ReflectionClass($class);
            $reflectFuncName = 'invoke';
            if (!$reflect->hasMethod($reflectFuncName)) {
                $output->writeln("任务{$name}必须包含{$reflectFuncName}");
                return;
            }
            $object = new $class();

            // 执行任务
            call_user_func([$object, $reflectFuncName]);

            // 输出任务执行完成
            $output->writeln("任务{$name}已执行完成");
        } catch (\Exception $e) {
            var_dump($e->getTraceAsString());
            $output->writeln("执行任务{$name}时异常:" . $e->getMessage() . "，文件位置" . $e->getFile() . ',行号' . $e->getLine());
        }
    }
}